#include <sys/un.h>
#include <stddef.h>
#include "wrap.h"

#define serv_sock "serv.socket"
#define clit_sock "clit.socket"

/* 这是一个使用IPC通信的本地套接字的客户端*/

void domain_socket_client(){
	int ret, len, cfd;
	char buf[4096];
	// 与网络通信不同是的，这里不可以使用隐式绑定，需要手动进行绑定，因此需要2个地址
	struct sockaddr_un serv_addr, clit_addr;

	// 1. 首先需要创建套接字
	cfd = Socket(AF_UNIX, SOCK_STREAM, 0);

	// 2. 初始化clit_addr，并进行bind绑定,不可以进行隐式绑定
	bzero(&clit_addr, sizeof(clit_addr));
	clit_addr.sun_family = AF_UNIX;
	strcpy(clit_addr.sun_path, clit_sock);

	// 3. 需要设置clit_addr的长度
	len = offsetof(struct sockaddr_un, sun_path) + strlen(clit_addr.sun_path);

	unlink(clit_sock);
	// 客户端也需要bind，而不能依赖与自动绑定
	Bind(cfd, (struct sockaddr*)&clit_addr, len);

///////////////////////////需要绑定服务器端的地址结构////////////////////////////////////////////////////////

	// 4. 需要使用connect与服务器进行连接
	// note：此时不可以使用隐式绑定，需要手动绑定
	bzero(&serv_addr, sizeof(serv_addr));
	serv_addr.sun_family = AF_UNIX;
	strcpy(serv_addr.sun_path, serv_sock);

	len = offsetof(struct sockaddr_un, sun_path) + strlen(serv_addr.sun_path);
	
	ret = connect(cfd, (struct sockaddr*)&serv_addr, len);
	if(ret == -1){
		perror("connect error!");
		exit(1);
	}

	while(fgets(buf, sizeof(buf),stdin) != NULL){
		// 5. 与服务器进行通信
		ret = Write(cfd, buf, sizeof(buf));

		ret = Read(cfd, buf, sizeof(buf));

		printf("server write data: %s\n", buf);
	}

	close(cfd);

}

int main(int argc, char *argv[]){
	domain_socket_client();	
}
